<?php


namespace App\Utils\JWT;


class Signer
{

    public static function encode(array $arr): string
    {
        return base64_encode(json_encode($arr));
    }

    public static function decode($jsonString): array
    {
        $str = base64_decode($jsonString);
        if (!$str) {
            return [];
        }
        $arr = json_decode($str, true);
        if (!is_array($arr)) {
            return [];
        }
        return $arr;
    }

    /**
     * @param string $data header.payload
     * @param string $alg
     * @return string
     */
    public static function makeSign(string $data, string $alg = '')
    {
        $secret = \Hyperf\Config\config('jwt.secret', '');
        $alg = self::alg2hash($alg);
        return hash_hmac($alg, $data, $secret);
    }

    /**
     * @param string $data header . payload
     * @param string $inputSign 签名部分
     * @param string $alg
     * @return bool 验证签名是否正确
     */
    public static function verifySign(string $data, string $inputSign, string $alg = '')
    {
        return self::makeSign($data, $alg) === $inputSign;
    }

    /**
     * @param string $alg JWT 头部中的
     * @return string 用于hash_mac()
     */
    protected static function alg2hash($alg)
    {
        return match ($alg) {
            'MD5' => 'md5',
            default => 'sha256',
        };
    }
}
